﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;

namespace Krile.Imported.Snippets
{
    static partial class Images
    {
        //
        // Reference:http://www.r-nakai.com/archives/41
        //( CommentOut? >>【.NET】カラー行列(ColorMatrix)で画像をグレースケール化する )
        //

        //RGB Proportion for NTSC coefficients method
        const float r = 0.298912F;
        const float g = 0.586611F;
        const float b = 0.114478F;

        /// <summary>
        /// 指定したイメージをグレースケール化します。
        /// </summary>
        /// <param name="img">元イメージ</param>
        /// <returns>グレースケールイメージ</returns>
        public static Image TransformGrayscale(Image img)
        {
            return (Image)TransformGrayscale(new Bitmap(img));
        }

        /// <summary>
        /// 指定したビットマップをグレースケール化します。
        /// </summary>
        /// <param name="bmp">元ビットマップ</param>
        /// <returns>グレースケールビットマップ</returns>
        public static Bitmap TransformGrayscale(Bitmap bmp)
        {
            if (bmp == null)
                throw new ArgumentNullException("Argument bmp is null.");

            float[][] elems = {
                                  new float[]{r, r, r, 0, 0},
                                  new float[]{g, g, g, 0, 0},
                                  new float[]{b, b, b, 0, 0},
                                  new float[]{0, 0, 0, 1, 0},
                                  new float[]{0, 0, 0, 0, 1}
                              };

            var attrib = new ImageAttributes();
            attrib.SetColorMatrix(new ColorMatrix(elems));

            var ret = new Bitmap(bmp.Width, bmp.Height);

            using (Graphics grp = Graphics.FromImage(ret))
            {
                grp.DrawImage(bmp,
                    new Rectangle(0, 0, ret.Width, ret.Height),
                    0, 0, bmp.Width, bmp.Height,
                    GraphicsUnit.Pixel, attrib);
            }
            return ret;
        }
    }
}